﻿/**
 * @file guild_brief_logic.h
 * @date 2021/05/18 10:05
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief 公会简略信息逻辑
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/05/18 10:05         <td>1.0.0       <td>harrybao
 * <td>创建初始版本 <tr><td>2021/05/19 20:16         <td>1.1.0 <td>harrybao
 * <td>添加修改、获取接口
 * </table>
 */

#pragma once

#include <functional>
#include "guild/guild.h"
#include "error/error_code.h"

struct GuildModuleBrief;
struct AnnounceData;

namespace guild_service {

/**
 * @brief 公会简略信息逻辑类
 *
 */
class GuildBriefLogic {
 private:
  /**
   * @brief Get the Guild Brief object
   * 
   * @param guild_id 
   * @param module_brief 
   * @return true 
   * @return false 
   */
  static bool GetGuildModuleBrief(const guild_id_type guild_id,
                            GuildModuleBrief &module_brief);

 public:
  /**
   * @brief 获取公会简略信息模块
   *
   * @param role_uuid 角色唯一id
   * @param ec 错误码
   * @param module_brief 公会简略信息模块
   * @return 
   */
  static bool GetGuildModuleBriefByRole(const role_uuid_type role_uuid,
                                  GuildModuleBrief &module_brief);

 public:
  /**
   * @brief 获取公会名字
   *
   * @param guild_id 公会id
   * @return std::string 公会名字
   */
  static const std::string &GetGuildName(const guild_id_type guild_id);

  /**
   * @brief 获取公会等级
   *
   * @param guild_id 公会id
   * @return uint32_t 公会等级
   */
  static uint32_t GetGuildLevel(const guild_id_type guild_id);

  /**
   * @brief 获取公会图标id
   *
   * @param guild_id 公会id
   * @return guild_icon_id_type 公会图标id
   */
  static guild_icon_id_type GetGuildIconId(const guild_id_type guild_id);

  /**
   * @brief 获取公会宣言
   *
   * @param guild_id 公会id
   * @return const std::string& 公会宣言
   */
  static const std::string &GetGuildDeclaration(const guild_id_type guild_id);

  /**
   * @brief 获取公会公告
   *
   * @param guild_id 公会id
   * @return const std::string& 公会公告
   */
  static const std::string &GetGuildAnnounce(const guild_id_type guild_id);

  /**
   * @brief 获取公会创建者角色唯一id
   *
   * @param guild_id 公会id
   * @return const role_uuid_type 创建者角色唯一id
   */
  static const role_uuid_type GetCreatorUuid(const guild_id_type guild_id);

  /**
   * @brief 获取公会会长角色唯一id
   *
   * @param guild_id 公会id
   * @return const role_uuid_type 公会会长角色唯一id
   */
  static const role_uuid_type GetChairmanUuid(const guild_id_type guild_id);

  /**
   * @brief 获取公会副会长角色唯一id
   *
   * @param guild_id 公会id
   * @return const role_uuid_type 公会副会长角色唯一id
   */
  static const role_uuid_type GetViceChairmanUuid(const guild_id_type guild_id);

  /**
   * @brief 是否自动入会
   *
   * @param guild_id 公会id
   * @return true 自动入会
   * @return false 非自动入会
   */
  static bool IsAutoApproval(const guild_id_type guild_id);

  /**
   * @brief 设置自动同意入会
   *
   * @param role_uuid 角色唯一id
   * @param is_auto_approval 是否自动入会
   * @param ec 错误码
   * @return true 设置成功
   * @return false 设置失败
   */
  static bool SetAutoApproval(const role_uuid_type role_uuid,
                              const bool is_auto_approval, error_code &ec);

 public:
  /**
   * @brief 修改公会图标
   * 
   * @param role_uuid 角色唯一id
   * @param icon_id 图标id
   * @param ec 错误码
   * @return 修改结果
  */
  static bool ChangeGuildIconIdByRole(const role_uuid_type role_uuid,
                                      const guild_icon_id_type icon_id,
                                      error_code &ec);

  /**
   * @brief 修改公会名字
   *
   * @param guild_id 公会id
   * @param name 公会名字
   * @return true 修改成功
   * @return false 修改失败
   */
  static bool ChangeGuildNameByRole(const role_uuid_type role_uuid,
                                    const std::string &name, error_code &ec);

  /**
   * @brief 修改公会宣言
   *
   * @param guild_id 公会id
   * @param declaraion 公会宣言
   * @return true 修改成功
   * @return false 修改失败
   */
  static bool ChangeGuildDeclarationByRole(const role_uuid_type role_uuid,
                                           const std::string &declaraion,
                                           error_code &ec);

  /**
   * @brief 修改公会公告
   *
   * @param guild_id 公会id
   * @param announce 公会公告
   * @return true 添加成功
   * @return false 添加失败
   */
  static bool ChangeGuildAnnounceByRole(const role_uuid_type role_uuid,
                                        const std::string &announce,
                                        error_code &ec);
  /**
   * @brief 交付道具
   * 
   * @param role_uuid 角色唯一id
   * @param item_id 道具id
   * @param item_count 道具数量
   * @param ec 错误码
   * @return true 交付道具成功
   * @return false 交付道具失败
   */
  static bool GiveGuildItem(const role_uuid_type role_uuid,
                            const uint32_t item_id, const uint32_t item_count,
                            error_code &ec);

 public:
  using NewsType = AnnounceData;  ///< 新闻类型
  using ForeachNewsCallbackType =
      std::function<void(const NewsType &)>;  ///< 遍历公会新闻回调函数类型

  /**
   * @brief 添加新闻
   *
   * @param guild_id 公会id
   * @param news 公会新闻
   * @return true 添加成功
   * @return false 添加失败
   */
  static bool AddNews(const guild_id_type guild_id, const NewsType &news);

  /**
   * @brief 遍历公会新闻
   *
   * @param guild_id 公会id
   * @param callback 回调函数
   */
  static void ForeachNews(const guild_id_type guild_id,
                          const ForeachNewsCallbackType &callback);
};

/**
 * @brief
 *
 */
class Checker {
  // TODO 检查公告宣言、公告的合法性
};

}  // namespace guild_service